package LimitedTimeGame.Day_0226;

/**
 * @author zxc
 * @date 2023/02/26 11:04
 **/

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * 题目 ：两个数组的交集
 * 题目详述 ：
 * 给你两个整数数组nums1 和 nums2 ，请你以数组形式返回两数组的交集。
 * 返回结果中每个元素出现的次数，应与元素在两个数组中都出现的次数一致（如果出现次数不一致，则考虑取较小值）。可以不考虑输出结果的顺序。
 *
 * 提示：
 * 1 <= nums1.length, nums2.length <= 1000
 * 0 <= nums1[i], nums2[i] <= 1000
 *
 */
public class Intersect02 {
    /**
     * 思路 ：
     * ===>
     * 排序 + 双指针
     * （1）首先，对于nums1和nums2数组进行排序;（将其中的元素按照从小到大的顺序，进行排序）
     * （2）其次，使用双指针p1和p2分别指向 排序后的nums1和nums2数组中首个元素;
     * （3）指针p1和p2逐渐向后移动，直至某个指针所指向的数组 遍历完成;
     *
     * @param nums1
     * @param nums2
     * @return
     */
    public int[] intersect(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;
        int[] result = new int[len1];
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        // 双指针p1，p2分别指向数组nums1和数组nums2
        int p1 = 0;
        int p2 = 0;
        int k = 0;
        while(p1 < len1 && p2 < len2){
            if(nums1[p1] < nums2[p2]){
                p1++;
            }
            else if(nums1[p1] > nums2[p2]){
                p2++;
            }
            else {
                result[k++] = nums1[p1];
                p1++;
                p2++;
            }
        }
        return Arrays.copyOfRange(result , 0 , k);
    }
}
